home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_3
/
password
/
source
/
passwd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-04-26
|
11KB
|
405 lines
#include <exec/memory.h>
#include <exec/execbase.h>
#include <dos/filehandler.h>
#include <intuition/intuitionbase.h>
#include <devices/hardblocks.h>
#include <devices/input.h>
#include <devices/conunit.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <MyStartup.h>
#include <MyLib.h>
/***********************************************/
LONG DoPkt1(struct MsgPort *, LONG, LONG);
#pragma libcall DOSBase DoPkt1 F0 32103
/***********************************************/
#define BLOCK_SIZE 512
#define NoBlock 0xffffffff
#define BLOCKS_NEEDED 4
#define PASSWORD_SIZE 40
/***********************************************/
char __chip Hardblock[BLOCK_SIZE];
struct RDArgs *RDArgs;
struct IntuitionBase *IntuitionBase;
struct IOStdReq IORequest;
struct IOStdReq InputRequest;
struct Window *MyWindow;
struct Task *MyTask;
struct
{
char *Drive;
} Arguments;
char VersionString[]="$VER: Password 1.1 (26.04.93)";
ULONG PasswordBlock;
int PasswordIndex;
char PasswordBuffer[PASSWORD_SIZE];
int BufferIndex;
BOOL Locked;
/***********************************************/
void CloseAll(int RC)
{
if (InputRequest.io_Command==IND_ADDHANDLER)
{
InputRequest.io_Command=IND_REMHANDLER;
DoIO(&InputRequest);
CloseDevice(&InputRequest);
}
CloseDevice(&IORequest);
CloseLibrary(IntuitionBase);
FreeArgs(RDArgs);
exit(RC);
}
/***********************************************/
void LoadBlock(int BufferSize, ULONG BlockNumber, ULONG BlockID)
{
int i;
ULONG SummedLongs;
LONG CheckSum;
ULONG *Temp;
if (CheckSignal(SIGBREAKF_CTRL_C))
{
PrintFault(ERROR_BREAK,"passwd");
CloseAll(RETURN_WARN);
}
IORequest.io_Command=CMD_READ;
IORequest.io_Length=BLOCK_SIZE;
IORequest.io_Data=Hardblock;
IORequest.io_Offset=BlockNumber*BLOCK_SIZE;
if (DoIO(&IORequest))
{
printf("Error reading block %ld\n",BlockNumber);
CloseAll(RETURN_FAIL);
}
if (BlockID)
{
if (BlockID!=((struct RigidDiskBlock *)Hardblock)->rdb_ID)
{
printf("Block %ld: exspected type 0x%lx got type 0x%lx\n",BlockNumber,BlockID,((struct RigidDiskBlock *)Hardblock)->rdb_ID);
CloseAll(RETURN_FAIL);
}
SummedLongs=((struct RigidDiskBlock *)Hardblock)->rdb_SummedLongs;
CheckSum=0;
Temp=(ULONG *)Hardblock;
for (i=0; i<SummedLongs; i++)
{
CheckSum=CheckSum+(*Temp++);
}
if (CheckSum)
{
printf("Checksum of block %ld is invalid.\n",BlockNumber);
CloseAll(RETURN_FAIL);
}
}
}
/***********************************************/
void SearchPassword(void)
{
ULONG RDBBlock;
BOOL FoundRDB;
FoundRDB=FALSE;
for (RDBBlock=0; RDBBlock<RDB_LOCATION_LIMIT && !FoundRDB; )
{
LoadBlock(sizeof(struct RigidDiskBlock),RDBBlock,0);
if (*(ULONG *)Hardblock==IDNAME_RIGIDDISK)
{
FoundRDB=TRUE;
}
else
{
RDBBlock++;
}
}
if (!FoundRDB)
{
printf("Sorry, I couldn't locate the RigidDiskBlock on this unit!\n");
CloseAll(RETURN_FAIL);
}
LoadBlock(sizeof(struct RigidDiskBlock),RDBBlock,IDNAME_RIGIDDISK);
PasswordBlock=((struct RigidDiskBlock *)Hardblock)->rdb_DriveInit;
while (PasswordBlock!=NoBlock)
{
LoadBlock(sizeof(struct LoadSegBlock),PasswordBlock,IDNAME_LOADSEG);
for (PasswordIndex=20; PasswordIndex<BLOCK_SIZE; PasswordIndex++)
{
if (!__builtin_strcmp(Hardblock+PasswordIndex,VersionString))
{
PasswordIndex+=__builtin_strlen(VersionString)+1;
return;
}
}
PasswordBlock=((struct LoadSegBlock *)Hardblock)->lsb_Next;
}
printf("Sorry, there is no password on this unit!\n");
CloseAll(RETURN_WARN);
}
/***********************************************/
void OpenDriveDevice(void)
{
struct DosList *DosList;
struct FileSysStartupMsg *StartupMsg;
char *Device;
ULONG Unit;
int RC;
RC=0;
DosList=LockDosList(LDF_READ | LDF_DEVICES);
if (DosList=FindDosEntry(DosList,Arguments.Drive,LDF_DEVICES))
{
StartupMsg=(struct FileSysStartupMsg *)BADDR(DosList->dol_misc.dol_handler.dol_Startup);
IORequest.io_Message.mn_ReplyPort=&((struct Process *)SysBase->ThisTask)->pr_MsgPort;
Device=((char *)BADDR(StartupMsg->fssm_Device))+1;
Unit=StartupMsg->fssm_Unit;
if (OpenDevice(Device,Unit,&IORequest,0))
{
printf("Unable to open %s unit %lu\n",Device,Unit);
RC=RETURN_FAIL;
}
else
{
printf("Locating password on %s unit %ld\n",Device,Unit);
}
}
else
{
printf("\x22%s:\x22 not found.\n",Arguments.Drive);
RC=RETURN_FAIL;
}
UnLockDosList(LDF_READ | LDF_DEVICES);
if (RC) CloseAll(RC);
}
/***********************************************/
struct InputEvent * __asm __saveds InputHandler(register __a0 struct InputEvent *InputEvent)
{
struct InputEvent *InputEvents;
ULONG IntuiLock;
struct Window *ActiveWindow;
InputEvents=InputEvent;
while (InputEvent)
{
IntuiLock=LockIBase(0);
ActiveWindow=IntuitionBase->ActiveWindow;
UnlockIBase(IntuiLock);
if (ActiveWindow==MyWindow)
{
if (InputEvent->ie_Class==IECLASS_RAWKEY)
{
if (!(InputEvent->ie_Code&IECODE_UP_PREFIX))
{
if (InputEvent->ie_Code<0x60 && !Locked)
{
switch(InputEvent->ie_Code)
{
case 0x44:
case 0x50: PasswordBuffer[BufferIndex]=0xfe;
Locked=TRUE;
Signal(MyTask,SIGBREAKF_CTRL_E);
break;
case 0x41: if (BufferIndex)
{
BufferIndex--;
}
break;
default: if (BufferIndex<PASSWORD_SIZE-2)
{
if (InputEvent->ie_Qualifier & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
{
InputEvent->ie_Code|=0x80;
}
PasswordBuffer[BufferIndex++]=InputEvent->ie_Code;
}
break;
}
}
}
InputEvent->ie_Class=IECLASS_NULL;
}
}
InputEvent=InputEvent->ie_NextEvent;
}
return(InputEvents);
}
/***********************************************/
void InstallInputHandler(void)
{
static struct Interrupt Interrupt=
{
NULL,NULL,
NT_INTERRUPT,
127,
"passwd",
NULL,
(void (*)())InputHandler
};
struct InfoData __aligned InfoData;
MyTask=SysBase->ThisTask;
Locked=TRUE;
InputRequest.io_Message.mn_ReplyPort=IORequest.io_Message.mn_ReplyPort;
DoPkt1(((struct FileHandle *)BADDR(Input()))->fh_Type,ACTION_DISK_INFO,MKBADDR(&InfoData));
MyWindow=((struct ConUnit *)(((struct IOStdReq *)(InfoData.id_InUse))->io_Unit))->cu_Window;
if (!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0)) ||
OpenDevice("input.device",0,&InputRequest,0))
{
CloseAll(RETURN_FAIL);
}
InputRequest.io_Command=IND_ADDHANDLER;
InputRequest.io_Data=&Interrupt;
DoIO(&InputRequest);
}
/***********************************************/
void EnterOldPassword(void)
{
int Try;
for (Try=0; Try<3; Try++)
{
printf("Please enter the current password: ");
Flush(Output());
BufferIndex=0;
Locked=FALSE;
Wait(SIGBREAKF_CTRL_E);
printf("\n");
while (BufferIndex>=0)
{
if (PasswordBuffer[BufferIndex]!=Hardblock[PasswordIndex+BufferIndex])
{
printf("Wrong password!\n");
break;
}
BufferIndex--;
}
if (BufferIndex<0)
{
return;
}
}
CloseAll(RETURN_ERROR);
}
/***********************************************/
void EnterNewPassword(void)
{
printf("Please enter the new password: ");
Flush(Output());
BufferIndex=0;
Locked=FALSE;
Wait(SIGBREAKF_CTRL_E);
printf("\n");
while (BufferIndex>=0)
{
Hardblock[PasswordIndex+BufferIndex]=PasswordBuffer[BufferIndex];
BufferIndex--;
}
printf("Enter the new password again: ");
Flush(Output());
BufferIndex=0;
Locked=FALSE;
Wait(SIGBREAKF_CTRL_E);
printf("\n");
while (BufferIndex>=0)
{
if (Hardblock[PasswordIndex+BufferIndex]!=PasswordBuffer[BufferIndex])
{
printf("Passwords do not match! Password not changed.\n");
CloseAll(RETURN_WARN);
}
BufferIndex--;
}
}
/***********************************************/
void SavePassword(void)
{
int i;
long CheckSum;
CheckSum=0;
((struct LoadSegBlock *)Hardblock)->lsb_ChkSum=0;
for (i=0; i<((struct LoadSegBlock *)Hardblock)->lsb_SummedLongs; i++)
{
CheckSum+=((long *)Hardblock)[i];
}
((struct LoadSegBlock *)Hardblock)->lsb_ChkSum=0-CheckSum;
printf("Saving new password to disk.\n");
IORequest.io_Command=CMD_WRITE;
IORequest.io_Length=BLOCK_SIZE;
IORequest.io_Data=Hardblock;
IORequest.io_Offset=PasswordBlock*BLOCK_SIZE;
if (DoIO(&IORequest))
{
printf("Error writing block %ld\n",PasswordBlock);
CloseAll(RETURN_FAIL);
}
}
/***********************************************/
void main(void)
{
if (CommandLineLength)
{
if (RDArgs=ReadArgs("DRIVE/A",(long *)&Arguments,NULL))
{
OpenDriveDevice();
SearchPassword();
InstallInputHandler();
EnterOldPassword();
EnterNewPassword();
SavePassword();
CloseAll(RETURN_OK);
}
PrintFault(IoErr(),"passwd");
}
CloseAll(RETURN_FAIL);
}